#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 30;

int n;
string word[N];
int used[N];
int g[N][N];
int ans;

void dfs(string dragon, int last) { // 目前的字符串的长度dragon, 结尾的单词的序号last
    ans = max((int)dragon.size(), ans); // 更新当前字符串的最大值
    
    used[last] ++ ; // 结尾单词用过次数 ++
    
    for (int i = 0; i < n; ++ i) // 遍历所有单词
        if (g[last][i] && used[i] < 2) // 只要该单词和结尾的单词有公共部分且该单词没有用到2次
            dfs(dragon + word[i].substr(g[last][i]), i); // 就继续从接上后的字符串开始搜索
    
    used[last] -- ; // 恢复
}

int main() {
    cin >> n;
    char start;
    for (int i = 0; i < n; ++ i) cin >> word[i];
    cin >> start;
    
    for (int i = 0; i < n; ++ i) 
        for (int j = 0; j < n; ++ j) { // 预处理每个单词末尾和另一个单词开始的最短公共长度
            string a = word[i], b = word[j];
            int az = a.size(), bz = b.size();
            for (int k = 1; k < min(az, bz); ++ k) // 从1到两者长度的最小值-1枚举最短公共长度
                if (a.substr(az - k, k) == b.substr(0, k)) { // 如果找到了
                    g[i][j] = k; // 存下来
                    break; // 并退出,此步由贪心可得,公共长度越短形成的字符串就越长
                }
        }
    
    for (int i = 0; i < n; ++ i) // 遍历每个单词
        if (word[i][0] == start) // 只要能接上开始的字母
            dfs(word[i], i); // 就从该单词开始搜索(即接龙)
    
    cout << ans << endl; // 输出所有结果的最大值
    
    return 0;
}